package com.baiwang.web.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**发票开具实体类的data
 * @author zhanliuzhu
 * @date 2024/4/16
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InvoiceIssueDetailData {

    /**
     * 发票种类编码, 004：增值税专用发票；007：增值税普通发票；026：增值税电子发票；025：增值税卷式发票；
     * * 028:增值税电子专用发票 01:全电发票(增值税专用发票) 02:全电发票(普通发票)
     */
    @NotEmpty(message = "发票种类编码不能为空")
    private String invoiceTypeCode;
    /**
     * 数电纸质发票标志，Y：是，N：否。税控类发票开具不校验此字段；暂只支持用数电电票红冲数电纸票
     */
    private String paperInvoiceFlag;
    /**
     * 选择纸质发票标志为Y时，纸票类型必填。票种为 普通发票02时可传： 04    2016版增值税普通发票（二联折叠票），
     * * 05    2016版增值税普通发票（五联折叠票); 票种为 增值税专用发票01可传： 1130 增值税专用发票（中文三联无金额限制版） ，
     * * 1140 增值税专用发票（中文四联无金额限制版） 1160 增值，税专用发票（中文六联无金额限制版） ，1170 增值税专用发票（中文七联无金额限制版）
     */
    private String paperInvoiceTypeCode;
    /**
     * 开票类型 0:正数发票（蓝票） 1：负数发票（红票）默认0
     */
    @NotEmpty(message = "开票类型不能为空")
    private String invoiceType;
    /**
     * 特殊票种标志， 00：普通发票；01：农产品销售；02：农产品收购；08：成品油 12 机动车（默认是00普通发票）;16矿产品；03稀土；
     * * 全电类发票特殊票种标志：01 成品油发票；03：建筑服务发票；04：货物运输服务发票；05：不动产销售服务发票；06：不动产租赁服务发票；
     * * 09：旅客运输发票；14：机动车；16：农产品收购
     */
    @NotEmpty(message = "特殊票种标志不能为空")
        private String invoiceSpecialMark;
    /**
     * 成品油单价过低是否确认开具标识：Y 是； N 否 为空时默认值为N （备注：专票单价过低强制开票会记入异常发票，
     * * 红冲需要在电子税务局申请解除然后再红冲；普票单价过低开具成功发票可以正常红冲）
     */
    
    private String isConfirmIssue;
    /**
     * 征税方式， 0：普通征税；2：差额征税（默认是0普通征税）
     */
    private String taxationMethod;
    /**
     * 差额征税标签：01 全额开票、 02 差额开票 ；发票类型代码为01，02时且征税方式为2必填
     */
    private String taxationLabel;
    /**
     * 0：无清单；1：带清单（专普票发票明细大于等于8行必须带清单）：大于8行必须为清单票(电子票只能为非请单票)
     * * （默认是0无清单），发票类型代码为01，02时该字段无
     */
    private String invoiceListMark;
    /**
     * 含税标志， 0：不含税；1：含税（默认不含税）
     */
    @NotEmpty(message = "含税标志不能为空")
    private String priceTaxMark;
    /**
     * 开票流水号， 唯一标志开票请求。支持数字字母下划线组合。
     */
    @NotEmpty(message = "开票流水号不能为空")
    private String serialNo;
    /**
     * 发票请求流水号
     */
    private String orderNo;
    /**
     * 购方单位税号， invoiceTypeCode=004、028、01（增值税专用发票、增值税电子专用发票、全电发票（增值税专用发票））开具时必传
     * * invoiceSpecialMark=16（农产品收购）开具时必传
     */
    @NotEmpty(message = "购方单位税号不能为空")
    private String buyerTaxNo;
    /**
     * 购方单位名称 全电为100个字符
     */
    @NotEmpty(message = "购方单位名称不能为空")
    private String buyerName;
    /**
     * 购方地址及电话， 增值税专用发票开具时必填，发票类型代码为01、02时该字段拆分为地址电话两个字段
     */
    private String buyerAddressPhone;
    /**
     * 购方开户行及账号， 增值税专用发票开具时必填，发票类型代码为01、02时该字段拆分为银行名称、账号两个字段
     */
    private String buyerBankAccount;
    /**
     * 开票人，税票取值逻辑：如果终端有值取终端，如果没有去机构获取，如果都没有会自动获取机构下随机用户名称。
     * * 数电票Web连接器取值逻辑：taxUserName＞drawer＞默认开票人＞终端授权开票人。数电票乐企连接器长度：300字符，必填
     */
    @NotEmpty(message = "开票人不能为空")
    private String drawer;
    /**
     * 复核人， 16个字符；税控开具时： 为空时，如果终端有值取终端，如果没有去机构获取，若都没有则为空！
     * * 全电类开具时：此字段非必填，即发票类型代码为01，02时该字段非必填
     */
    @NotEmpty(message = "复核人不能为空")
    private String checker;
    /**
     * 收款人， 16个字符；税控类开具时：若为空，如果终端有值取终端，如果没有去机构获取，若都没有则为空；
     * * 全电类开具时：此字段非必填，即发票类型代码为01，02时该字段非必填
     */
    @NotEmpty(message = "收款人不能为空")
    private String payee;
    /**
     * 合计金额， 保留两位小数；支持价税分离
     */
    private BigDecimal invoiceTotalPrice;
    /**
     * 合计税额， 保留两位小数；支持价税分离
     */
    private BigDecimal invoiceTotalTax;
    /**
     * 价税合计， 保留两位小数；支持价税分离
     */
    private BigDecimal invoiceTotalPriceTax;
    /**
     * 备注 乐企长度为230个字符
     */
    private String remarks;
    /**
     * 红字信息表/确认单编号，仅invoiceType=1时需要传入数据 税控类红票开具时，
     * * invoiceTypeCode=004、028时必须传值，传入红字信息表编号； 全电类红票开具时，
     * * invoiceTypeCode=01、02时必须传值，传入红字确认单编号；
     */
    private String redInfoNo;
    /**
     * 原发票代码， invoiceType=1，税控负数普票开具时必传；红票选数电票时，此项可为空。
     */
    private String originalInvoiceCode;
    /**
     * 原发票号码， invoiceType=1，税控负数普票开具时必传；红票选数电票时，此项可为空
     */
    private String originalInvoiceNo;
    /**
     * 扣除额， taxationLabel=2，差额征税时必传。数值必须小于价税合计。
     */
    private BigDecimal deductibleAmount;
    /**
     * 销方地址及电话，发票类型代码为01、02时该字段拆分为地址、电话两个字段
     */
    private String sellerAddressPhone;
    /**
     * 销方开户行及账号，发票类型代码为01、02时不用此字段
     */
    private String sellerBankAccount;
    /**
     * Map&#60;String, Object>, 扩展字段
     */
    private Map<String, Object> ext;
    /**
     * 第三方系统名称
     */
    private String systemName;
    /**
     * 第三方系统id
     */
    private String systemId;
    /**
     * 客户邮箱
     */
    private String buyerEmail;
    /**
     * 抄送人邮箱,多个用英文逗号隔开,最多5个抄送人信息 全电字符长度为200
     */
    private String emailCarbonCopy;
    /**
     * 客户电话
     */
    private String buyerPhone;
    /**
     * 用户账号，用于个人维度数据标记
     */
    private String userAccount;
    /**
     * 红冲原因（1 销货退回 2 开票有误 3 服务终止 4 销售折让）税控红冲原因：建议按实际开票情况传入红冲原因，
     * * 若不传系统会自动根据情况判断并赋值；全电红冲原因：必填
     */
    private String redIssueReason;
    /**
     * 整单折扣类型（数电发票暂不支持） 1 :按折扣金额价内折扣,2:按折扣金额价外折扣,3:按折扣率价内折扣,4:按折扣率价外折扣
     */
    private String discountType;
    /**
     * 整单折扣金额（数电发票暂不支持）,大于0小于发票总金额，如果是含税发票，大于0小于含税总金额
     */
    private BigDecimal discountAmount;
    /**
     * 整单折扣率（数电发票暂不支持）,取值[1-100]正整数
     */
    private Integer discountRate;
    /**
     * 卷式发票票样  01 02 03 04 05 06 07
     */
    private String mainGoodsName;
    /**
     * 购买方银行名称，发票类型代码为01、02时该字段可用
     */
    // @NotEmpty(message = "购买方银行名称不能为空")
    private String buyerBankName;
    /**
     * 购买方银行账号，发票类型代码为01、02时该字段可用
     */
    // @NotEmpty(message = "购买方银行账号不能为空")
    private String  buyerBankNumber;
    /**
     * 购买方地址，发票类型代码为01、02时该字段可用
     */
    // @NotEmpty(message = "购买方地址不能为空")
    private String buyerAddress;
    /**
     * 购买方电话，发票类型代码为01、02时该字段可用
     */
    // @NotEmpty(message = "购买方电话不能为空")
    private String buyerTelphone;
    /**
     * 销方银行名称，发票类型代码为01、02时该字段可用
     */
    @NotEmpty(message = "销方银行名称不能为空")
    private String sellerBankName;
    /**
     * 销方银行账号，发票类型代码为01、02时该字段可用
     */
    @NotEmpty(message = "销方银行账号不能为空")
    private String sellerBankNumber;
    /**
     * 销方地址，发票类型代码为01、02时该字段可用
     */
    @NotEmpty(message = "销方地址不能为空")
    private String sellerAddress;
    /**
     * 销方电话，发票类型代码为01、02时该字段可用
     */
    @NotEmpty(message = "销方电话不能为空")
    private String sellerTelphone;
    /**
     * 红字信息表UUID，开具全电负数发票必传
     */
    private String redConfirmUuid;
    /**
     * 合同号
     */
    private String contractNumber;
    /**
     * 凭证号
     */
    private String voucherNo;
    /**
     * 购方自然人标记Y:自然人；  N:非自然人，默认为N
     */
    private String buyerNaturalPerson;
    /**
     * 购方开户行银行账号是否显示在备注，true：购方开户行银行账号显示在备注，或者false：购方开户行银行账号不显示在备注
     */
    private Boolean displayBuyer;
    /**
     * 销方开户行银行账号是否显示在备注。true：销方开户行银行账号显示在备注，或者false：销方开户行银行账号不显示在备注
     */
    private Boolean displaySeller;
    /**
     * N：无共同购买方，Y：有公同购买方，传Y时共同购买方信息字段必填；不传默认按N处理；不支持乐企
     */
    private String mulPurchaserMark;
    /**
     * List&#60;InvoiceIssueCoPurchaseInfo>, 共同购买方标识传Y时共同购买方明细字段必填
     */
    private List<InvoiceIssueCoPurchaseInfo> mulPurchaserList;
    /**
     *商品明细节点
     */
    @NotEmpty(message = "商品明细节点不能为空")
    private List<OutputInvoiceIssueInvoiceDetail> invoiceDetailsList;
    /**
     * List<OutputInvoiceIssueInvoiceSpecialInfo>, 特定业务信息节点，当特殊票种标志为03、04、05、06时必填；
     * * 当特殊票种标志为09时特定要素信息字段必须同时为空或同时不为空；
     */
    private List<OutputInvoiceIssueInvoiceSpecialInfo>invoiceSpecialInfoList;



}

